﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Contract.Business.Process;
using Contract.Business.Entity;
using Contract.Business.Filter;
using GenericControlsWinForm.Extensions;

namespace Fast.Presentation.WinForms.Cruds
{
    public partial class FrmSubGrupo : Form
    {
        public FrmSubGrupo()
        {
            InitializeComponent();
        }

        #region *** Atributos ***

        BESubGrupo entidade;
        List<BETamanho> listaDeTamanho;
        BPSubGrupo processSubGrupo;
        BPGrupo processGrupo;
        BPTamanho processTamanho;

        #endregion

        #region *** Botões Crud ***
        private void btnNovo_Click(object sender, EventArgs e)
        {
            try
            {
                if (btnNovo.Text.Equals("Novo"))
                {
                    LimparCampos();
                    this.carregarDataGrid(null);
                    grbDados.Enabled = true;
                    Utilidades.carregarNovo(grbBotoes);
                }
                else if (ValidarFormulario())
                {
                    entidade = new BESubGrupo();
                    entidade.Descricao = this.txtDescricao.Text;
                    entidade.CodigoGrupo = int.Parse(this.cboGrupo.SelectedValue.ToString());
                    entidade.Tamanhos = montarSubGrupoTamanho();

                    processSubGrupo = new BPSubGrupo();
                    entidade = processSubGrupo.Salvar(entidade);

                    this.lblCodigo.Text = entidade.Codigo.ToString();

                    MessageBox.Show("Sub Grupo cadastrado.");
                    grbDados.Enabled = false;
                    Utilidades.carregarConfirmarNovo(grbBotoes);
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void btnAlterar_Click(object sender, EventArgs e)
        {
            if (btnAlterar.Text.Equals("Alterar"))
            {
                grbDados.Enabled = true;
                Utilidades.carregarAlterar(grbBotoes);
            }
            else if (ValidarFormulario())
            {
                entidade = new BESubGrupo();
                entidade.Codigo = int.Parse(this.lblCodigo.Text);
                entidade.Descricao = this.txtDescricao.Text;
                entidade.CodigoGrupo = int.Parse(this.cboGrupo.SelectedValue.ToString());
                entidade.Tamanhos = montarSubGrupoTamanho();

                processSubGrupo = new BPSubGrupo();
                processSubGrupo.Salvar(entidade);

                MessageBox.Show("Sub Grupo alterado.");
                grbDados.Enabled = false;
                Utilidades.carregarConfirmarAlterar(grbBotoes);
            }
        }

        private void btnConsultar_Click(object sender, EventArgs e)
        {
            FrmSubGrupoConsultar frm = new FrmSubGrupoConsultar();
            frm.ShowDialog();

            if (frm.entidade != null)
            {
                this.lblCodigo.Text = frm.entidade.Codigo.ToString();
                this.txtDescricao.Text = frm.entidade.Descricao;
                this.cboGrupo.SelectedValue = frm.entidade.CodigoGrupo;
                this.carregarDataGrid(frm.entidade.Tamanhos);

                Utilidades.carregarConsultar(grbBotoes);
            }
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Deseja excluir este item?", "Fast Pizza", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                processSubGrupo = new BPSubGrupo();
                entidade = new BESubGrupo();
                entidade.Codigo = int.Parse(this.lblCodigo.Text);

                processSubGrupo.Excluir(entidade);

                LimparCampos();
                MessageBox.Show("Sub Grupo excluído com sucesso.");
                grbDados.Enabled = false;
                Utilidades.carregarExcluir(grbBotoes);
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            LimparCampos();
            grbDados.Enabled = false;
            Utilidades.carregarCancelar(grbBotoes);
        }
        #endregion

        #region *** Eventos ***

        private void FrmSubGrupo_Load(object sender, EventArgs e)
        {
            carregarGrupos();
            carregarTamanhos();

            this.dgvSubGrupoTamanho.Columns[0].ReadOnly = false;
            this.dgvSubGrupoTamanho.Columns[4].ReadOnly = false;
        }

        #endregion

        #region *** Métodos ***

        private void carregarDataGrid(List<BESubGrupoTamanho> tamanhos)
        {
            this.dgvSubGrupoTamanho.Rows.Clear();

            DataGridViewRow row;
            if (tamanhos == null)
            {
                foreach (BETamanho item in listaDeTamanho)
                {
                    row = NewRowTamanho();
                    row.Cells[1].Value = item.Codigo;
                    row.Cells[2].Value = item.Descricao;
                    row.Cells[3].Value = item.Sigla;
                    row.Cells[4].Value = 0;

                    this.dgvSubGrupoTamanho.Rows.Add(row);
                }
            }
            else
            {
                foreach (BETamanho item in listaDeTamanho)
                {
                    row = NewRowTamanho();
                    if (tamanhos.Any(q => q.CodigoTamanho == item.Codigo))
                    {
                        row.Cells[0].Value = true;
                        row.Cells[4].Value = tamanhos.Where(q => q.CodigoTamanho == item.Codigo).First().Preco.ToString("N2");
                    }
                    else
                    {
                        row.Cells[0].Value = false;
                        row.Cells[4].Value = 0.0;
                    }
                    row.Cells[1].Value = item.Codigo;
                    row.Cells[2].Value = item.Descricao;
                    row.Cells[3].Value = item.Sigla;

                    this.dgvSubGrupoTamanho.Rows.Add(row);
                }
            }
        }

        private DataGridViewRow NewRowTamanho()
        {
            DataGridViewRow row = new DataGridViewRow();
            row.CreateCells(this.dgvSubGrupoTamanho);
            return row;
        }

        private bool ValidarFormulario()
        {
            if (String.IsNullOrEmpty(this.txtDescricao.Text))
            {
                MessageBox.Show("Campo Descrição é obrigatório.");
                return false;
            }

            if (cboGrupo.SelectedValue.Equals(0))
            {
                MessageBox.Show("Campo Grupo é obrigatório.");
                return false;
            }

            return true;
        }

        private void carregarGrupos()
        {
            try
            {
                processGrupo = new BPGrupo();
                List<BEGrupo> lista = processGrupo.ObterTodos(new FEGrupo()).OrderBy(q => q.Descricao).ToList();

                BEGrupo selecione = new BEGrupo();
                selecione.Codigo = 0;
                selecione.Descricao = "Selecione...";

                lista.Insert(0, selecione);

                cboGrupo.DataSource = lista;
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void carregarTamanhos()
        {
            processTamanho = new BPTamanho();
            listaDeTamanho = processTamanho.ObterTodos(new FETamanho());
        }

        private List<BESubGrupoTamanho> montarSubGrupoTamanho()
        {
            List<BESubGrupoTamanho> lista = new List<BESubGrupoTamanho>();
            BESubGrupoTamanho temp;
            foreach (DataGridViewRow row in this.dgvSubGrupoTamanho.Rows)
            {
                if (row.Cells["dgvPossui"].Value != null && Convert.ToBoolean(row.Cells["dgvPossui"].Value.ToString()))
                {
                    temp = new BESubGrupoTamanho();
                    temp.CodigoTamanho = int.Parse(row.Cells["dgvCodigo"].Value.ToString());
                    temp.Preco = decimal.Parse(row.Cells["dgvPreco"].Value.ToString());

                    lista.Add(temp);
                }
            }

            return lista;
        }

        private void LimparCampos()
        {
            this.lblCodigo.Text = "...";
            this.txtDescricao.Apagar();
            this.cboGrupo.SelectedIndex = 0;
            this.dgvSubGrupoTamanho.Rows.Clear();
        }
        #endregion

    }
}
